"""
2025/1/2
文件对比（对比指定目录下所有文件的名称及大小，将不相符的文件记录在日志）
"""


import os
import hashlib
import logging
from tqdm import tqdm

def setup_logging():
    # 创建并配置日志记录器
    logging.basicConfig(
        encoding='utf-8',
        filename='error.log',  # 日志文件的名称
        level=logging.INFO,  # 日志级别，只记录 INFO 及以上级别的日志信息
        format='%(asctime)s:%(levelname)s:%(message)s',  # 日志消息的格式
        datefmt='%Y-%m-%d %H:%M:%S'  # 日期时间的格式
    )
setup_logging()

def file_hash(file_path):
    """计算文件的哈希值"""
    hash_obj = hashlib.sha256()
    try:
        with open(file_path, 'rb') as file:
            # 以 4096 字节为块读取文件
            for chunk in iter(lambda: file.read(4096), b""):
                hash_obj.update(chunk)
    except FileNotFoundError as e:
        logging.error("not found file "+file_path)
    return hash_obj.hexdigest()

def are_files_same(file_path1, file_path2):
    """判断两个文件是否相同"""
    hash1 = file_hash(file_path1)
    hash2 = file_hash(file_path2)
    if hash1 == hash2:
        #print(f"文件 {file_path1} 和文件 {file_path2} 相同。")
        return True
    else:
        #print(f"文件 {file_path1} 和文件 {file_path2} 不同。")
        logging.error("The files are inconsistent " + file_path2)
        return False
# 调用函数并传入要比较的文件路径
#are_files_same("D:\\test\\target\\wj\\dzjj\\temp\\2d435e89291b4274854a961b7496e6b1\\xm - 副本.json",
# "D:\\test\\target\\wj\\dzjj\\temp\\2d435e89291b4274854a961b7496e6b1\\xm.json")

def count_files(directory):
    count = 0
    for root, dirs, files in os.walk(directory):
        count += len(files)
    return count


def traverse_directory(target_dir,bac_dir):
    #total = len(os.listdir(target_dir)) 
    #pbar = tqdm(total=total)
    total_files = count_files(target_dir)
    with tqdm(total=total_files) as pbar:
        for root, dirs, files in os.walk(target_dir):
            # 打印当前目录路径
            #print(f"当前目录: {root}")
            # 打印当前目录下的子目录
            '''for dir in dirs:
                print(f"子目录: {os.path.join(root, dir)}")'''
            # 打印当前目录下的文件
            for file in files:
                pbar.update(1)
                target_file = os.path.join(root, file)
                bac_file = target_file.replace(target_dir,bac_dir)

                are_files_same(target_file,bac_file)
                
                #print('target_file  ',target_file)
                #print('bac_file  ',bac_file)

                #print("file  ",file)
                #print(f"文件: {os.path.join(root, file)}")
       

# 调用函数并传入要遍历的目录
traverse_directory("D:\\test\\target\\wj","D:\\test\\bac\\wj")
logging.error("---------------------------------")
#traverse_directory("D:\\test\\bac\\wj","D:\\test\\target\\wj")


"""
def log_messages():
    # 调用 setup_logging 函数进行日志配置
    setup_logging()
    # 记录不同级别的日志信息
    logging.info("This is an info message.")
    logging.warning("This is a warning message.")
    logging.error("This is an error message.")
"""
